package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.model.product.BaseCategoryTrademark;
import com.atguigu.gmall.model.product.BaseTrademark;
import com.atguigu.gmall.model.product.CategoryTrademarkVo;
import com.atguigu.gmall.product.mapper.BaseCategoryTrademarkMapper;
import com.atguigu.gmall.product.mapper.BaseTrademarkMapper;
import com.atguigu.gmall.product.service.BaseCategoryTrademarkService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * @author atguigu-mqx
 */
@Service
public class BaseCategoryTrademarkServiceImpl extends ServiceImpl<BaseCategoryTrademarkMapper,BaseCategoryTrademark> implements BaseCategoryTrademarkService {

    //  调用mapper 层
    @Autowired
    private BaseCategoryTrademarkMapper baseCategoryTrademarkMapper;
    @Autowired
    private BaseTrademarkMapper baseTrademarkMapper;

    @Override
    public List<BaseTrademark> findTrademarkList(Long category3Id) {
        //  传进来的参数只有一个分类Id base_trademark 与 category3Id 没有关系！
        //  base_category_trademark 这张表中有 category3Id , 通过分类Id 可以获取到品牌Id
        //  通过品牌id 能够获取 base_trademark的数据了！
        QueryWrapper<BaseCategoryTrademark> baseCategoryTrademarkQueryWrapper = new QueryWrapper<>();
        baseCategoryTrademarkQueryWrapper.eq("category3_id", category3Id);
        //  所有对象集合
        List<BaseCategoryTrademark> baseCategoryTrademarkList = baseCategoryTrademarkMapper.selectList(baseCategoryTrademarkQueryWrapper);

        //  需要品牌Id！ 拉姆达表达式！ 复制小括号，写死右箭头，落地大括号！
        //        List<Long> longIdList = new ArrayList<>();
        //        for (BaseCategoryTrademark baseCategoryTrademark : baseCategoryTrademarkList) {
        //            longIdList.add(baseCategoryTrademark.getTrademarkId());
        //        }
        //  Function R apply(T t); t： 当前集合对象的泛型！
        //  做映射关系！
        //        baseCategoryTrademarkList.stream().map((baseCategoryTrademark)->{
        //
        //        })
        if (!CollectionUtils.isEmpty(baseCategoryTrademarkList)){
            //  将stream 流计算完成的数据，以list集合的形式返回！
            List<Long> longIdList = baseCategoryTrademarkList.stream().map(baseCategoryTrademark -> {
                //  返回！
                return baseCategoryTrademark.getTrademarkId();
            }).collect(Collectors.toList());
            //  返回数据！ 1,2,3,4
            return baseTrademarkMapper.selectBatchIds(longIdList);
        }

        // 返回空！
        return null;

    }

    @Override
    public List<BaseTrademark> findCurrentTrademarkList(Long category3Id) {
        //  shift + F2
        //  1,2,3 ;  所有Id 1,2,3,5,7!
        QueryWrapper<BaseCategoryTrademark> baseCategoryTrademarkQueryWrapper = new QueryWrapper<>();
        baseCategoryTrademarkQueryWrapper.eq("category3_id", category3Id);
        //  所有对象集合
        List<BaseCategoryTrademark> baseCategoryTrademarkList = baseCategoryTrademarkMapper.selectList(baseCategoryTrademarkQueryWrapper);

        //  做判断
        if(!CollectionUtils.isEmpty(baseCategoryTrademarkList)){
            //  获取到当前这个分类Id 对应的 品牌Id！  1,2,3
            List<Long> idList = baseCategoryTrademarkList.stream().map(baseCategoryTrademark -> {
                return baseCategoryTrademark.getTrademarkId();
            }).collect(Collectors.toList());

            //  排除1,2,3 获取到 5， 7！
            //  Predicate    boolean test(T t);
            //  1.  查询所有可以用的品牌Id
            List<BaseTrademark> baseTrademarkList = baseTrademarkMapper.selectList(null).stream().filter(baseTrademark -> {
                return !idList.contains(baseTrademark.getId());
            }).collect(Collectors.toList());

            //  返回可选的列表！
            return baseTrademarkList;
        }

        //  如果没有获取到数据加载所有品牌数据！
        return baseTrademarkMapper.selectList(null);
    }

    @Override
    public void saveCategoryTrademark(CategoryTrademarkVo categoryTrademarkVo) {
        //  保存的本质：向base_category_trademark 插入数据！
        List<Long> trademarkIdList = categoryTrademarkVo.getTrademarkIdList();
        //  获取品牌Id集合数据！
        //        for (Long tmId : trademarkIdList) {
        //            //  创建对象
        //            Long category3Id = categoryTrademarkVo.getCategory3Id();
        //
        //            BaseCategoryTrademark baseCategoryTrademark = new BaseCategoryTrademark();
        //            baseCategoryTrademark.setCategory3Id(category3Id);
        //            baseCategoryTrademark.setTrademarkId(tmId);
        //
        //            //  插入数据：   循环插入数据！
        //            baseCategoryTrademarkMapper.insert(baseCategoryTrademark);
        //        }

        //  普通循环
        //        List<BaseCategoryTrademark> baseCategoryTrademarks = new ArrayList<>();
        //        for (Long tmId : trademarkIdList) {
        //            //  创建对象
        //            Long category3Id = categoryTrademarkVo.getCategory3Id();
        //
        //            BaseCategoryTrademark baseCategoryTrademark = new BaseCategoryTrademark();
        //            baseCategoryTrademark.setCategory3Id(category3Id);
        //            baseCategoryTrademark.setTrademarkId(tmId);
        //
        //            baseCategoryTrademarks.add(baseCategoryTrademark);
        //        }

        //  map 映射：
        List<BaseCategoryTrademark> baseCategoryTrademarks = trademarkIdList.stream().map(tmId -> {
            //  拉姆达表达式写法！
            BaseCategoryTrademark baseCategoryTrademark = new BaseCategoryTrademark();
            baseCategoryTrademark.setCategory3Id(categoryTrademarkVo.getCategory3Id());
            baseCategoryTrademark.setTrademarkId(tmId);
            return baseCategoryTrademark;
        }).collect(Collectors.toList());
        //  批量插入数据！
        this.saveBatch(baseCategoryTrademarks);

    }

    @Override
    public void removeBaseCategoryTrademark(Long category3Id, Long trademarkId) {
        //  base_category_trademark 解除绑定！
        QueryWrapper<BaseCategoryTrademark> baseCategoryTrademarkQueryWrapper = new QueryWrapper<>();
        baseCategoryTrademarkQueryWrapper.eq("category3_id",category3Id);
        baseCategoryTrademarkQueryWrapper.eq("trademark_id",trademarkId);
        baseCategoryTrademarkMapper.delete(baseCategoryTrademarkQueryWrapper);
    }
}
